JACKまわりパァ~っと見てて思うところ


概要

このへんについて、FUDにならないように気をつけて書く。

なんか間違ってそうだったら @toru_inoue まで一報ください、、土下座して直す。


資料

JACKの解説

https://source.android.com/source/jack.html


JACKを使ってjava8の機能を使う話

http://developer.android.com/preview/j8-jack.html#configuration


JACKの解説記事(ちょこちょこ表現が違うんでなんかちょっと内容が古い気がする

http://tools.android.com/tech-docs/jackandjill


用語

Javaの由来が大きく2つに分かれそうなんで、JVMで動く前提のjavacでコンパイルするjavaをJVM java

JACKでコンパイルするjavaをJACK javaと勝手に呼ぼうと思う。


実現され、標準になりそうなもの


1 .Something.java -> dex変換

.java -> .class -> いろいろ -> .dex


だったのが、


.java -> JACK -> .dex になる。


.classを挟まなくなるので、今まで存在していたみたいな

「別の言語コンパイルして混ぜて、最終的に.classを吐く」

みたいなのをAndroidでのアプリ開発に使用することができなくなる。


例えばscalacとかだと、.javaと.scalaファイルを読んで、.class吐いてたけど、

これってもう動かせないのでは?っていう。

でも大丈夫、.jarとか.classからjackへと突っこめるツールチェインがあるんで、なんとかなる!



2 .jar -> jill -> .jack or .dex変換

おおまかにこう。


.jar(or .class) -> JILL -> JACK -> .jack or .dex


.jackはJACKでコンパイルしたものを.dexではなくライブラリとして吐き出す場合の拡張子。


なーんかページによって言ってることが妙な気がするが、自分が参考にしたのはこれ。

https://source.android.com/source/jack.html


.classからはJILLを介してJayce(独自中間表現)が吐けて、それをJACKでimport、.jackを吐くことができそう。



ざっと見た感じこんな感じなので

.classをビルドに関与させるにはJILLを介さないとダメ、かつライブラリ扱いになりそうなんだけど(確実に.class作成後じゃないと噛み合わせられないんじゃないかと思うわけだが)


それでいいのかな。という感じ。


例えば.scalaとかをJACKで書いた.javaと共存させたい場合、

ツールチェーンでJACKを通るルートでは.javaが書けるけど、そこから呼び出せるScalaのコードとかは、

.javaを編集してる瞬間にはすでにコンパイル済みの状態で.classになってないといけないのでは??っていう。


具体的なコンパイルフローはこんなの。


1. Scalaのコード書く(このコードはScalaとJVM javaで書ける)(ただしこの領域で完結している必要がある。理由は後述)

2. .classにしてJILLに食わせて.jackにしておく

3. .javaのコードから.jackライブラリで定義されてるScala由来のコードを呼ぶ、とか


これ以外のルートがなさそうな気が。



上のルートだけだと困りそうな理由

上の1で書く言語は、そのコンパイル単位で依存関係が閉じていないといけないはず。じゃないと.classにできない。

なので、1で書いてるコードから、3で書くJACK javaのpublic classの参照とかはできないのでは?っていう。(逆は当然できるはず。)


これはまあ、「.classとか.jarをライブラリにする」っていう作業なんで、用途としては合ってる。

で、これを律儀に守る限り、Kotlinで自由に書きたい! アプリケーションのメイン部分をKotlinで!!、みたいな書き方はできなそうで。

JACKでコンパイルする.javaのほうに、ライブラリに対してハンドラを全力で渡す、みたいなブートストラップを書くのかな?


それ、、えっと、、、メインをJACK java以外で書きたい人の精神は耐えられるのかな?? 


あっでもライブラリがJACK java以外で便利に書ける+それを合一できるのはすごくいいな。



楽観も悲観もしてないようなこと

Androidの公式サポートしてる言語はJavaとかGoなので、それ以外の言語を使うのに関してはもう抵抗がある。

昔ScalaでAndroid App書いてたけど、やはりとても辛かった。


で、JACK javaでとりあえずJava継続って感じなので、いいんじゃねーかなーという。



個人的な感想

まだなんかビッグニュースがあるそうなんで、

1.新言語発表!! モダンなツールチェーン(まさかここがJACK、、、みたいなのは大いにありそう)で.dexを吐ける! .jackも読める!!

2.JACKは.javaをサポートする最後の独自コンパイラ世代として全てのJava資産の回収とかリライトをサポートする


みたいな流れだと胸熱だなあと思っている。

.class -> .dexは本当にろくでもないツールチェーンだと思ってるんでなくなってよかった。


書いてて思ったけどJACKのJはJavaのJだからJACKで別言語コンパイル -> dexはなさそうだな。

公式の新言語出るといいな。